package com.linkgie.galaxyframework.crypto.spi;

/**
 * 字节编解码器；
 * 
 * @author liso
 *
 */
public interface BytesCodec<T> {

	/**
	 * 检查指定的编码数据；
	 * <p>
	 * 
	 * 如果不支持，或者格式无法识别，则返回 false；
	 * 
	 * @param encodedBytes
	 * @return
	 */
	default boolean isSupported(byte[] encodedBytes) {
		return isSupported(encodedBytes, 0, encodedBytes.length);
	}

	/**
	 * 检查指定的编码数据；
	 * <p>
	 * 
	 * 如果不支持，或者格式无法识别，则返回 false；
	 * 
	 * @param encodedBytes
	 * @return
	 */
	boolean isSupported(byte[] encodedBytes, int offset, int length);

	/**
	 * 解析指定的数据，创建对应的数据对象；
	 * <p>
	 * 
	 * 如果无法识别，则返回 null；
	 * 
	 * @param encodedBytes
	 * @param offset
	 * @param length
	 * @return
	 */
	default T decode(byte[] encodedBytes) {
		return decode(encodedBytes, 0, encodedBytes.length);
	}

	/**
	 * 解析指定的密码数据，创建对应的密码数据对象；
	 * <p>
	 * 
	 * 如果无法识别，则返回 null；
	 * 
	 * @param encodedBytes
	 * @param offset
	 * @param length
	 * @return
	 */
	T decode(byte[] encodedBytes, int offset, int length);

	/**
	 * 编码数据指定类型的密码数据；
	 * <p>
	 * 
	 * @param rawBytes 原始数据；
	 * @return 已编码的密码数据；
	 */
	T encode(byte[] rawBytes);

}
